CMakePackageConfigHelpers 這個工具還具有一個非常方便的功能,可以幫助產生專案的版本文件(xxxConfigVersion.cmake),以便讓find_package指令能夠找到它。
透過使用這個版本文件,開發者可以讓find_package明確指定他們所需的第三方程式庫的版本條件,如果環境中安裝的第三方程式庫版本不符合要求,將會出現錯誤提示,提醒用戶升級或修復庫的版本問題。
定義:產生xxxConfigVersion.cmake檔案,讓find_package知道此專案的版本,並且在需求版本與專案版本不同時,做出對應的動作,看是要繼續編譯還是跳出錯誤訊息提醒使用者。
write_basic_package_version_file(
<filename>
[VERSION <major.minor.patch>]
COMPATIBILITY <AnyNewerVersion|SameMajorVersion|SameMinorVersion|ExactVersion>)
filename:輸出名稱,通常為 xxxConfigVersion.cmake。
VERSION:此專案的版本。
COMPATIBILITY AnyNewerVersion:任一版本都相容。
COMPATIBILITY SameMajorVersion:在相同主版本號的情況下相容,這個相容性設定最常見,因為主版本號的變更有很大機率彼此會不相容。
COMPATIBILITY SameMinorVersion:在相同的主版本號與次要版本號相同的情況下相容。
COMPATIBILITY ExactVersion:主版本號、次版本號、補釘版本都相同的情況才能相容。
定義:尋找所需第三方庫
find_package(<package_name1>
[major[.minor[.patch[.tweak]]]] [EXACT]
[REQUIRED]
[[COMPONENTS] name1 name2 ...]
)
[major[.minor[.patch[.tweak]]]]:可以指定單一版本,也可以指定一個範圍(versionMin...[<]versionMax)
EXACT:版本號是否需要完全一致
REQUIRED : 如果找不到該庫,就停止編譯並報錯
COMPONENTS : 該庫所依賴的其他組件
1. 編寫 MathFunctions / CMakeLists.txt
write_basic_package_version_file(
${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion
)
# 生成 ${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake 文件,讓 find_package 知道這個第三方庫是什麼版本
# 相容性設定為和主要版本號相同
⭐P.S. 可以自行更換不同的相容性設定來看看使用結果
2. 編譯並安裝
$ cd build
$ cmake ..
$ make
$ sudo make install
kai@esoc:~/2023_iT_CMake/Day24/MathFunctions/build$ sudo make install
[100%] Built target mysqrt
Install the project...
-- Install configuration: ""
-- Up-to-date: /usr/local/include/mysqrt.h
-- Up-to-date: /usr/local/lib/libmysqrt.so.1.5.0
-- Up-to-date: /usr/local/lib/libmysqrt.so.1
-- Up-to-date: /usr/local/lib/libmysqrt.so
-- Up-to-date: /usr/local/lib/cmake/MathFunctions/MathFunctionsConfig.cmake <----⭐
-- Up-to-date: /usr/local/lib/cmake/MathFunctions/MathFunctionsConfigVersion.cmake <----⭐
可以注意到,除了 Config.cmake 之外,今天我們多產生了一個名為 Config.cmake 的檔案,這個檔案通常包含了此專案的版本相關設定。
3. 編寫 Main / CMakeLists.txt
find_package(MathFunctions 1.0.0 REQUIRED)
# 尋找版本為 1.0.0 的 MathFunctionsConfig.cmake,REQUIRED 將其設定為必要項目,若找不到則會報錯
4. 編譯與執行
$ cd Main/build
$ cmake ..
kai@esoc:~/2023_iT_CMake/Day24/Main/build$ cmake ..
-- The CXX compiler identification is GNU 11.4.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- MathFunctions_FOUND: 1
-- MathFunctions_INCLUDE_DIRS: /usr/local/include
-- MathFunctions_LIBRARY_DIRS: /usr/local/lib
-- MathFunctions_LIBS: mysqrt
-- MathFunctions_VERSION: 1.5.0 <----- 找到庫的版本號⭐
-- Configuring done
-- Generating done
-- Build files have been written to: /home/kai/2023_iT_CMake/Day24/Main/build
$ make
$ ./main 10
kai@esoc:~/2023_iT_CMake/Day24/Main/build$ cmake ..
-- The CXX compiler identification is GNU 11.4.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at CMakeLists.txt:6 (find_package):
Could not find a configuration file for package "MathFunctions" that is
compatible with requested version "1.6.0".
The following configuration files were considered but not accepted:
/usr/local/lib/cmake/MathFunctions/MathFunctionsConfig.cmake, version: 1.5.0
-- Configuring incomplete, errors occurred!
See also "/home/kai/2023_iT_CMake/Day24/Main/build/CMakeFiles/CMakeOutput.log".